---
title: clsPolicyData
summary: API reference for clsPolicyData.
status: draft
owner: SAIF Corporation
last_reviewed: 2026-08-21
library: SAIF.Business.View.Policy
reference_type: embedded
---

# clsPolicyData

`clsPolicyData` is the aggregate root for the library's policy-view model. Callers enter through `GetPolicyData` and receive a read-only projection loaded from Oracle procedure `pk73094_policy_data.getpolicy`, then navigate to lazily populated child objects such as agency, address, periods, service team, trading-as names, and association headers. The type also applies demo-user masking, derives display values such as market type and current-period selection, and tolerates failures in secondary detail reads so the primary retrieve can still succeed.

## Purpose
- Retrieve the policy header projection after validating the policy number before the Oracle read begins ([BR-VP-001](../../business-rules.md#br-vp-001-policy-number-must-be-valid-before-retrieve)).
- Expose the library's central read model so callers can navigate to agency, address, periods, team-assignment, trading-as, and association data from one object.
- Enforce read-time presentation rules such as demo masking, market-type mapping, future-cancel-date gating, current/renewal period selection, and login-date semantics ([BR-VP-010](../../business-rules.md#br-vp-010-demo-users-see-masked-data), [BR-VP-016](../../business-rules.md#br-vp-016-market-type-mapping), [BR-VP-017](../../business-rules.md#br-vp-017-future-cancel-date-only-for-pending-cancellation), [BR-VP-018](../../business-rules.md#br-vp-018-currentrenewal-period-selection), [BR-VP-023](../../business-rules.md#br-vp-023-login-date-on-or-before-2000-01-01-is-never-logged-in)).
- Preserve overall retrieval success when optional detail reads fail, leaving those secondary fields unset instead of failing the header object ([BR-VP-026](../../business-rules.md#br-vp-026-detail-read-failure-does-not-fail-overall-retrieve)).

## Context
- Namespace: `SAIF.Business.View.Policy`
- Assembly/package: `SAIF.Business.View.Policy` (embedded)

## Public members
| Member | Signature | Purpose |
| --- | --- | --- |
| `GetPolicyData` | `Public Shared Function GetPolicyData(ByVal inCriteria As Criteria) As clsPolicyData` | Rehydrates a policy view using a prebuilt criteria object when a caller needs to preserve an existing portal context or access-level selection. |
| `GetPolicyData` | `Public Shared Function GetPolicyData(ByVal inDataportal As IDataPortalInfo, ByVal inPolicyNum As Decimal) As clsPolicyData` | Primary factory entry point for policy-header retrieval using the default SAIF-employee access level. |
| `GetPolicyData` | `Public Shared Function GetPolicyData(ByVal inDataportal As IDataPortalInfo, ByVal inPolicyNumbers As IEnumerable(Of Decimal)) As List(Of clsPolicyData)` | Expands a set of policy numbers into individually retrieved aggregate roots for batch consumers that still need one object per policy. |
| `GetPolicyData` | `Public Shared Function GetPolicyData(ByVal inDataportal As IDataPortalInfo, ByVal inPolicyNum As Decimal, ByVal inUserAccessLevel As UserAccessLevels) As clsPolicyData` | Retrieves the aggregate with an explicit caller access level so downstream masking and affiliate/association behavior match the requesting user type. |
| `GetPolicyAddress` | `Public Shared Function GetPolicyAddress(ByVal inDataPortalInfo As IDataPortalInfo, ByVal inPolicyNumber As Decimal) As clsPolicyAddress` | Returns the mailing-address projection associated with the policy header without forcing callers to construct `clsPolicyAddress` directly. |
| `GetPolicyClaimAddress` | `Public Shared Function GetPolicyClaimAddress(ByVal inDataPortalInfo As IDataPortalInfo, ByVal inPolicyNumber As Decimal, ByVal inGetMailAddrFlag As clsPolicyAddress.YesNoFlag) As clsPolicyAddress` | Returns the claim-address projection, optionally falling back to mailing-address data when claim-specific address data is absent. |
| `DEFAULT_USER_ACCESS_LEVEL` | `Public Const DEFAULT_USER_ACCESS_LEVEL As UserAccessLevels = UserAccessLevels.SAIFEmployee` | Sets the baseline access context used when callers do not supply a user type, which in turn controls masking and related retrieval choices. |
| `ASSIGNED_RISK_MARKET_TYPE` | `Public Const ASSIGNED_RISK_MARKET_TYPE As String = "ARP"` | Encodes the non-voluntary market code used by `IsAssignedRisk` and `MarketTypeDescription` when mapping retrieved policy data ([BR-VP-016](../../business-rules.md#br-vp-016-market-type-mapping)). |
| `VOLUNTARY_MARKET_TYPE` | `Public Const VOLUNTARY_MARKET_TYPE As String = "VOL"` | Encodes the voluntary market code that maps to the voluntary display branch in `MarketTypeDescription` ([BR-VP-016](../../business-rules.md#br-vp-016-market-type-mapping)). |
| `Agency` | `Public ReadOnly Property Agency() As clsAgency` | Lazily retrieves and caches the agency-of-record snapshot for the current policy so callers can navigate agency identity and contact data on demand. |
| `PolicyPeriods` | `Public ReadOnly Property PolicyPeriods() As clsPolicyPeriodCollection` | Lazily materializes the ordered period collection that drives current-period and renewal-period selection ([BR-VP-018](../../business-rules.md#br-vp-018-currentrenewal-period-selection)). |
| `TeamAssignmentCollection` | `Public ReadOnly Property TeamAssignmentCollection() As clsTeamAssignmentCollection` | Lazily loads the service-team roster used both for display and for loss-control authorization checks elsewhere in the library. |
| `Associations` | `Public ReadOnly Property Associations() As IEnumerable(Of PolicyAssociation)` | Lazily returns the current policy-association model that supersedes the obsolete affiliate API and includes the source policy when loaded through this property. |
| `TradingAsCollection` | `Public ReadOnly Property TradingAsCollection() As clsTradingAsCollection`* | Exposes the policy's DBA names as a child collection for consumers that need alternate operating names alongside the policy header.* |
| `HasWaiver` | `Public ReadOnly Property HasWaiver() As Boolean` | Triggers the one-time waiver-count lookup and reports whether the policy currently has a third-party waiver record. |
| `IsDemoUser` | `Public ReadOnly Property IsDemoUser() As Boolean` | Identifies the access levels that must receive masked names, addresses, identifiers, and related contact fields ([BR-VP-010](../../business-rules.md#br-vp-010-demo-users-see-masked-data)). |
| `CurrentPolicyPeriod` | `Public ReadOnly Property CurrentPolicyPeriod() As clsPolicyPeriod` | Returns the currently open period, or the first period when no open period is present, using the status-selection rules encoded in the period collection ([BR-VP-018](../../business-rules.md#br-vp-018-currentrenewal-period-selection)). |
| `LatestPolicyPeriodInfoPagePrinted` | `Public ReadOnly Property LatestPolicyPeriodInfoPagePrinted() As clsPolicyPeriod` | Selects the renewal period with a printed information page, otherwise the current period, for callers that need the most relevant issued term. |
| `FutureCancelDate` | `Public ReadOnly Property FutureCancelDate() As Date` | Returns a future cancellation date only when the policy is in pending-cancellation status; all other statuses surface `Date.MinValue` ([BR-VP-017](../../business-rules.md#br-vp-017-future-cancel-date-only-for-pending-cancellation)). |
| `MaxPolicyholderLoginDate` | `Public ReadOnly Property MaxPolicyholderLoginDate As Date` | Scans external Business Online accounts for the policy and suppresses dates on or before 2000-01-01 as "never logged on" ([BR-VP-023](../../business-rules.md#br-vp-023-login-date-on-or-before-2000-01-01-is-never-logged-in)). |
| `Additional read-only properties` | `150+ additional read-only properties` | Provide the remaining policy identifiers, status codes, dates, agency snapshot fields, financial indicators, login descriptors, and obsolete affiliate-era accessors; several obsolete members direct callers to use `Associations` instead of the legacy affiliate model. |

## Behavioral notes
- `BeforeRetrieve` sends `apolicynum` to Oracle procedure `pk73094_policy_data.getpolicy`, and `ValidPolicyNum` blocks the call when the policy number is not greater than zero ([BR-VP-001](../../business-rules.md#br-vp-001-policy-number-must-be-valid-before-retrieve)).
- The object follows a lazy-read pattern: `Agency`, `Address`, `ClaimAddress`, `PolicyPeriods`, `TeamAssignmentCollection`, `Associations`, and several detail-backed fields each load on first access rather than during the initial header retrieve.
- Demo access levels mask policyholder name, legal name, FEIN, group name, address-related children, agency data, and team-member data through `clsConstants.DataMaskingConstants` ([BR-VP-010](../../business-rules.md#br-vp-010-demo-users-see-masked-data)).
- `MarketTypeDescription`, `IsAssignedRisk`, and `IsVoluntary` all derive from the retrieved market code, mapping `VOL` to voluntary and every other code to assigned risk ([BR-VP-016](../../business-rules.md#br-vp-016-market-type-mapping)).
- `FutureCancelDate` only executes its cancellation lookup when the converted policy status is pending cancellation ([BR-VP-017](../../business-rules.md#br-vp-017-future-cancel-date-only-for-pending-cancellation)).
- `GetCurrentPolicyPeriod` prefers periods whose `isCurrentPolicyPeriod` flag is true, and `GetLatestPolicyPeriodInfoPagePrinted` prefers renewal periods with printed information pages before falling back to the current period ([BR-VP-018](../../business-rules.md#br-vp-018-currentrenewal-period-selection)).
- `MaxPolicyholderLoginDate` treats 2000-01-01 and earlier as "never logged on" even when the proxy returns a concrete date ([BR-VP-023](../../business-rules.md#br-vp-023-login-date-on-or-before-2000-01-01-is-never-logged-in)).
- `LazyRead(LazyReadRequest.PolicyDetail)` catches and suppresses exceptions, so missing detail data does not invalidate the header object ([BR-VP-026](../../business-rules.md#br-vp-026-detail-read-failure-does-not-fail-overall-retrieve)).
- Affiliate-related properties remain compiled but are marked `<Obsolete("Use data from the Associations property instead.")>`, indicating the associations model has replaced the legacy affiliate API.

## Constraints and usage notes
- This library is read-only: the criteria object returns empty create/insert/update/delete SQL, consistent with [BR-VP-027](../../business-rules.md#br-vp-027-createinsertupdatedelete-sql-are-invalid).
- `UserAccessLevel` is not cosmetic; it drives masking behavior and also influences affiliate/association retrieval paths for external users.
- Consumers that need complete child data must touch each child property explicitly; loading the aggregate root alone does not eagerly hydrate related objects.
- Obsolete affiliate members should be avoided for new consumers in favor of `Associations` and the newer association-type model.

> **Note:** Statements marked with * were inferred from code structure, naming conventions, or
> contextual evidence where direct confirmation was not available in source artifacts. Statements
> marked with ** could not be confirmed; treat as unknown until verified.

## Sources
- `SAIF.Business.View.Policy/clsPolicyData.vb`
